package org.mmy.mmybackend.PictureChangType;

import com.luciad.imageio.webp.WebPImageReaderSpi;
import com.luciad.imageio.webp.WebPImageWriterSpi;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriter;
import javax.imageio.spi.IIORegistry;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;

// 静态注册 WebP ImageIO SPI (如果你没有使用模块系统或者 SPI 自动发现有问题)
// 通常，Maven 依赖会自动处理 SPI 注册，但如果遇到 "No writer found for webp"
// 可以尝试手动注册。


public class PicCnTy {

    static {
        // 尝试静态注册，以防 SPI 自动发现失败。
        // 对于大多数现代Java环境和构建工具，这通常不是必需的。
        IIORegistry registry = IIORegistry.getDefaultInstance();
        registry.registerServiceProvider(new WebPImageReaderSpi());
        registry.registerServiceProvider(new WebPImageWriterSpi());
    }

    /**
     * 将图片从一种格式转换为另一种格式。
     *
     * @param inputPath  输入图片路径
     * @param outputPath 输出图片路径
     * @param formatName 目标格式 (例如 "webp", "png", "jpg", "jpeg", "gif", "bmp")
     * @return 如果转换成功则返回 true，否则返回 false
     */
    public static boolean convertImageFormat(String inputPath, String outputPath, String formatName) {
        try {
            File inputFile = new File(inputPath);
            File outputFile = new File(outputPath);

            // 确保输出目录存在
            File outputDir = outputFile.getParentFile();
            if (outputDir != null && !outputDir.exists()) {
                if (!outputDir.mkdirs()) {
                    System.err.println("无法创建输出目录: " + outputDir.getAbsolutePath());
                    return false;
                }
            }

            // 1. 读取输入图片
            BufferedImage image;
            try (ImageInputStream iis = ImageIO.createImageInputStream(inputFile)) {
                if (iis == null) {
                    System.err.println("无法为输入文件创建 ImageInputStream: " + inputPath);
                    return false;
                }
                Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
                if (!readers.hasNext()) {
                    System.err.println("没有找到合适的读取器来读取图片: " + inputPath);
                    return false;
                }
                ImageReader reader = readers.next();
                reader.setInput(iis, true);
                image = reader.read(0); // 读取第一帧
                reader.dispose();
            }

            if (image == null) {
                System.err.println("无法读取输入图片: " + inputPath);
                return false;
            }

            // 特殊处理：如果从包含Alpha通道的格式（如PNG）转换为不支持Alpha的格式（如JPG/JPEG），
            // 透明区域可能会变黑。可以创建一个新的不带Alpha的图像并绘制原图。
            // 对于WebP到其他格式，通常不需要，因为WebP本身支持Alpha。
            // 如果目标是JPG/JPEG，并且源图像可能有透明度，则最好处理一下：
            if (("jpg".equalsIgnoreCase(formatName) || "jpeg".equalsIgnoreCase(formatName)) && image.getTransparency() != BufferedImage.OPAQUE) {
                BufferedImage newImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
                newImage.createGraphics().drawImage(image, 0, 0, java.awt.Color.WHITE, null); // 用白色背景填充透明区域
                image = newImage;
            }


            // 2. 写入输出图片
            boolean success;
            try (ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile)) {
                if (ios == null) {
                    System.err.println("无法为输出文件创建 ImageOutputStream: " + outputPath);
                    return false;
                }
                Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(formatName.toLowerCase());
                if (!writers.hasNext()) {
                    System.err.println("没有找到合适的写入器来写入格式: " + formatName);
                    System.err.println("可用的写入格式: " + String.join(", ", ImageIO.getWriterFormatNames()));
                    return false;
                }
                ImageWriter writer = writers.next();
                writer.setOutput(ios);
                writer.write(image); // 写入图像
                writer.dispose();
                success = true;
            }

            if (success) {
                System.out.println("图片转换成功: " + outputPath);
            } else {
                System.err.println("图片转换失败 (写入步骤)。");
            }
            return success;

        } catch (IOException e) {
            System.err.println("图片转换过程中发生IO错误: " + e.getMessage());
            e.printStackTrace();
            return false;
        } catch (Exception e) {
            System.err.println("图片转换过程中发生未知错误: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }

    public static void main(String[] args) {
        // 直接在代码中指定图片路径和目标格式
        String inputPath = "./uploads_data/15.jpg";
        String outputPath = "./uploads_data/15.webp";
        String format = "webp"; // 目标格式，可以是jpg, png, gif, webp, jpeg, bmp

        try {
            // 调用转换方法
            convertImageFormat(inputPath, outputPath, format);
            System.out.println("图片转换成功！");
            System.out.println("输入文件: " + inputPath);
            System.out.println("输出文件: " + outputPath);
            System.out.println("目标格式: " + format.toUpperCase());

            // 验证转换后的文件格式
            verifyOutputFormat(outputPath, format);
        } catch (IOException e) {
            System.err.println("图片转换失败: " + e.getMessage());
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            System.err.println("错误: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("发生未知错误: " + e.getMessage());
            e.printStackTrace();
        }
    }





    // 验证输出文件格式
    private static void verifyOutputFormat(String filePath, String expectedFormat) throws IOException {
        File file = new File(filePath);
        if (!file.exists()) {
            throw new FileNotFoundException("验证失败：输出文件不存在");
        }

        // 尝试读取文件格式
        try (ImageInputStream iis = ImageIO.createImageInputStream(file)) {
            Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);

            if (!readers.hasNext()) {
                System.err.println("警告：无法确定输出文件格式！可能只是更改了后缀名。");
                return;
            }

            ImageReader reader = readers.next();
            String actualFormat = reader.getFormatName().toLowerCase();

            // 格式匹配检查 (考虑到别名和不同命名)
            boolean formatMatched = false;
            switch (expectedFormat.toLowerCase()) {
                case "jpg":
                case "jpeg":
                    formatMatched = actualFormat.contains("jpeg");
                    break;
                case "webp":
                    formatMatched = actualFormat.contains("webp");
                    break;
                case "png":
                    formatMatched = actualFormat.contains("png");
                    break;
                case "gif":
                    formatMatched = actualFormat.contains("gif");
                    break;
                case "bmp":
                    formatMatched = actualFormat.contains("bmp");
                    break;
                default:
                    formatMatched = actualFormat.contains(expectedFormat.toLowerCase());
            }

            if (formatMatched) {
                System.out.println("格式验证成功：输出文件是" + expectedFormat.toUpperCase() + "格式");
            } else {
                System.err.println("警告：格式验证失败！");
                System.err.println("预期格式: " + expectedFormat.toUpperCase());
                System.err.println("实际检测格式: " + actualFormat.toUpperCase());
                System.err.println("可能只是更改了文件后缀名，而没有真正转换格式。");
                System.err.println("请确保已添加WebP支持库 (webp-imageio) 到您的项目中。");
            }
        }
    }
}